package com.bookstore.back.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bookstore.back.entity.Book;

import java.util.List;
import java.util.Map;

/**
 * 图书服务接口
 * 
 * @author 程序猿_Ti
 * @since 2025-07-19
 */
public interface BookService extends IService<Book> {

    /**
     * 分页查询图书列表
     * 
     * @param params 查询参数
     * @return 分页结果
     */
    IPage<Book> getBookList(Map<String, Object> params);

    /**
     * 创建图书
     * 
     * @param book 图书信息
     * @return 是否成功
     */
    boolean createBook(Book book);

    /**
     * 更新图书信息
     * 
     * @param bookId 图书ID
     * @param book 图书信息
     * @return 是否成功
     */
    boolean updateBook(Integer bookId, Book book);

    /**
     * 删除图书
     * 
     * @param bookId 图书ID
     * @return 是否成功
     */
    boolean deleteBook(Integer bookId);

    /**
     * 切换图书状态
     * 
     * @param bookId 图书ID
     * @param status 状态
     * @return 是否成功
     */
    boolean toggleBookStatus(Integer bookId, Integer status);

    /**
     * 批量删除图书
     * 
     * @param bookIds 图书ID列表
     * @return 是否成功
     */
    boolean batchDeleteBooks(List<Integer> bookIds);

    /**
     * 获取热门图书
     *
     * @param limit 数量限制
     * @return 热门图书列表
     */
    List<Book> getPopularBooks(Integer limit);

    /**
     * 获取图书详情（包含标签信息）
     *
     * @param bookId 图书ID
     * @return 图书详情
     */
    Book getBookWithTags(Integer bookId);

    /**
     * 更新图书标签关联
     *
     * @param bookId 图书ID
     * @param tagIds 标签ID列表
     * @return 是否成功
     */
    boolean updateBookTags(Integer bookId, List<Integer> tagIds);

    /**
     * 获取推荐图书列表
     *
     * @param limit 数量限制
     * @return 推荐图书列表
     */
    List<Book> getRecommendedBooks(Integer limit);

    /**
     * 获取新书上架列表
     *
     * @param limit 数量限制
     * @return 新书列表
     */
    List<Book> getNewBooks(Integer limit);

    /**
     * 获取个性化推荐图书列表
     *
     * @param userId 用户ID（可为空，为空时返回通用推荐）
     * @param limit 数量限制
     * @return 个性化推荐图书列表
     */
    List<Book> getPersonalizedBooks(Long userId, Integer limit);

}
